name: CI Report
run-name: CI Report(#${{ github.event.workflow_run.id }})

on:
  workflow_run:
    workflows: [ "CI PIPELINE", "CI PIPELINE - BRANCH" ]
    types:
      - completed

permissions:
  checks: write
  actions: write
  contents: write
  deployments: write
  discussions: write
  issues: write
  packages: write
  pages: write
  pull-requests: write
  repository-projects: write
  security-events: write
  statuses: write

env:
  HEAD_SHA: ${{ github.event.workflow_run.head_sha }}

jobs:
  INFO:
    runs-on: [ self-hosted, quick ]
    if: >
      github.event.workflow_run.event == 'pull_request' &&
      (github.event.workflow_run.conclusion == 'success' || github.event.workflow_run.conclusion == 'failure')
    outputs:
      PR_NUMBER: ${{ steps.pr_details.outputs.PR_NUMBER }}
      BASE_REF: ${{ steps.pr_details.outputs.BASE_REF }}
    steps:
      - run: |
          sleep 10

      - name: Download workflow artifact - PR
        uses: dawidd6/action-download-artifact@v2
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          run_id: ${{ github.event.workflow_run.id }}
          name: 'pr_num'

      - name: Read the pr num file
        id: pr_num_reader
        uses: juliangruber/read-file-action@v1
        with:
          path: ./pr_num.txt

      - name: PR DETAILS
        id: pr_details
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          PR_NUMBER: ${{ steps.pr_num_reader.outputs.content }}
          REPO: ${{ github.repository }}
        run: |
          PR_NUMBER=`echo ${PR_NUMBER}`
          base_ref=`gh pr view ${PR_NUMBER} -R ${REPO} --json baseRefName -q .baseRefName`
          echo "BASE_REF=${base_ref}" >> $GITHUB_OUTPUT
          echo "PR_NUMBER=${PR_NUMBER}" >> $GITHUB_OUTPUT

      - name: INFO
        id: info
        run: |
          echo ${{ steps.pr_details.outputs.PR_NUMBER }}
          echo ${{ steps.pr_details.outputs.BASE_REF }}

  FE-REPORT:
    runs-on: [ self-hosted, quick ]
    needs: INFO
    if: needs.INFO.outputs.PR_NUMBER != ''
    env:
      PR_NUMBER: ${{ needs.INFO.outputs.PR_NUMBER }}
      BASE_REF: ${{ needs.INFO.outputs.BASE_REF }}
    steps:
      - name: CLEAN
        run: |
          rm -rf ${{ github.workspace }} && mkdir -p ${{ github.workspace }}

      - name: INFO
        id: info
        run: |
          repo="${{ github.repository }}"
          bucket_prefix=`echo ${repo%/*} | tr '[:upper:]' '[:lower:]'`
          echo "bucket_prefix=${bucket_prefix}" >> $GITHUB_OUTPUT

      - name: Download FE UT XML
        id: download-ut-xml
        env:
          bucket_prefix: ${{ steps.info.outputs.bucket_prefix }}
        run: |
          oss_path=oss://${bucket_prefix}-ci-release/$BASE_REF/Release/pr/UT-Report/${PR_NUMBER}
          size=$(ossutil64 --config-file ~/.ossutilconfig ls ${oss_path}/fe_ut_report.tar.gz | grep "Object Number is" | awk '{print $NF}')
          echo "size=${size}" >> $GITHUB_OUTPUT
          if [[ "$size" != "0" ]]; then
            mkdir fe && cd fe
            ossutil64 --config-file ~/.ossutilconfig cp ${oss_path}/ . --recursive
            tar zxf fe_ut_report.tar.gz
          elif [[ "${BASE_REF}" == "main" ]]; then
            rm -rf ./coverchecker && ln -s /var/local/env/coverchecker ./coverchecker && cd coverchecker && git pull
            export JAVA_HOME=/var/local/env/jdk1.8.0_202;
            export PATH=$JAVA_HOME/bin:$PATH;
            java -jar cover-checker-console/target/cover-checker-console-1.4.0-jar-with-dependencies.jar \
              --cover /var/local/env/empty_cov_result --github-token ${{ secrets.GITHUB_TOKEN }} \
              --repo ${{ github.repository }} --threshold 80 --github-url api.github.com --pr ${PR_NUMBER} -type jacoco
          fi

      - name: Publish UT Report
        uses: mikepenz/action-junit-report@v3
        id: publish_report
        if: steps.download-ut-xml.outputs.size != '0'
        env:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          token: ${{ secrets.GITHUB_TOKEN }}
        with:
          check_name: 'FE UT Report'
          detailed_summary: true
          fail_on_failure: true
          commit: ${{ github.event.workflow_run.head_sha }}
          report_paths: ./fe/fe-core/target/surefire-reports/*.xml

      - name: Merge FE Coverage
        id: merge_report
        if: steps.publish_report.outcome == 'success' && env.BASE_REF == 'main'
        env:
          fe_path: ${{ github.workspace }}/fe
        run: |
          export JAVA_HOME=/var/local/env/jdk1.8.0_202;
          export PATH=$JAVA_HOME/bin:$PATH;
          rm -rf ./ci-tool && cp -rf /var/lib/ci-tool ./ci-tool && cd ci-tool && git pull && source lib/init.sh
          if [[ -e ${fe_path}/test.exec ]]; then
            java -jar package/jacococli.jar merge ${fe_path}/fe-core/target/jacoco.exec ${fe_path}/test.exec --destfile ${fe_path}/merge.exec
          else
            cp ${fe_path}/fe-core/target/jacoco.exec ${fe_path}/merge.exec
          fi

      - name: Generate XML Report
        id: generate-xml-report
        env:
          package_path: ${{ github.workspace }}/ci-tool/package
          fe_path: ${{ github.workspace }}/fe
          fe_core_path: ${{ github.workspace }}/fe/fe-core
          bucket_prefix: ${{ steps.info.outputs.bucket_prefix }}
        if: steps.merge_report.outcome == 'success'
        run: |
          rm -rf result
          export JAVA_HOME=/var/local/env/jdk1.8.0_202;
          export PATH=$JAVA_HOME/bin:$PATH;
          cd ${fe_core_path}/target/classes;
          rm -rf org;
          cd com/starrocks && rm -rf thrift proto sql/parser builtins common/Version.class;
          cd ${{ github.workspace }};
          java -jar $package_path/jacococli.jar report ${fe_path}/merge.exec --classfiles ${fe_core_path}/target/classes/ \
            --html ./result --xml ${{ github.workspace }}/coverage.xml \
            --sourcefiles ${fe_core_path}/src/main/java/ --encoding utf-8 --name fe-coverage
          oss_path=oss://${bucket_prefix}-ci-release/$BASE_REF/Release/pr/UT-Report/${PR_NUMBER}/
          ossutil64 --config-file ~/.ossutilconfig cp coverage.xml ${oss_path} -f

      # Incremental Total Coverage
      - name: Publish Incremental Coverage Report - Total
        if: steps.generate-xml-report.outcome == 'success'
        env:
          fe_path: ${{ github.workspace }}/fe
        run: |
          rm -rf ./coverchecker && ln -s /var/local/env/coverchecker ./coverchecker && cd coverchecker && git pull
          export JAVA_HOME=/var/local/env/jdk1.8.0_202;
          export PATH=$JAVA_HOME/bin:$PATH;
          if [[ -e "${fe_path}/diff.txt" ]]; then
            java -jar cover-checker-console/target/cover-checker-console-1.4.0-jar-with-dependencies.jar \
              --cover ${{ github.workspace }}/result/ --github-token ${{ secrets.GITHUB_TOKEN }} \
              --repo ${{ github.repository }} --threshold 80 --github-url api.github.com --pr ${PR_NUMBER} -type jacoco \
              -d ${fe_path}/diff.txt -dt file
          else
            java -jar cover-checker-console/target/cover-checker-console-1.4.0-jar-with-dependencies.jar \
              --cover ${{ github.workspace }}/result/ --github-token ${{ secrets.GITHUB_TOKEN }} \
              --repo ${{ github.repository }} --threshold 80 --github-url api.github.com --pr ${PR_NUMBER} -type jacoco
          fi
          rm -rf coverchecker
          rm -rf ci-tools

      # total coverage
      - name: Coverage Report
        uses: codecov/codecov-action@v3
        if: steps.generate-xml-report.outcome == 'success'
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          files: ${{ github.workspace }}/coverage.xml
          dry_run: false
          name: fe-total
          flags: fe-total
          fail_ci_if_error: false
          verbose: true
          override_pr: ${{ env.PR_NUMBER }}
          override_branch: ${{ env.BASE_REF }}
          override_commit: ${{ env.HEAD_SHA }}

      - name: Clean ENV
        if: always()
        run: |
          rm -rf ${{ github.workspace }}/*

  BE-REPORT:
    runs-on: [ self-hosted, quick ]
    needs: INFO
    if: needs.INFO.outputs.PR_NUMBER != '' && needs.INFO.outputs.BASE_REF == 'main'
    env:
      GH_TOKEN: ${{ github.token }}
      REPO: ${{ github.repository }}
      PR_NUMBER: ${{ needs.INFO.outputs.PR_NUMBER }}
      BASE_REF: ${{ needs.INFO.outputs.BASE_REF }}
    steps:
      - name: CLEAN
        run: |
          rm -rf ${{ github.workspace }} && mkdir -p ${{ github.workspace }}

      - name: INFO
        id: info
        run: |
          bucket_prefix=`echo ${REPO%/*} | tr '[:upper:]' '[:lower:]'`
          echo "bucket_prefix=${bucket_prefix}" >> $GITHUB_OUTPUT

      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Download BE UT XML
        id: download-ut-xml
        env:
          bucket_prefix: ${{ steps.info.outputs.bucket_prefix }}
        run: |
          oss_path=oss://${bucket_prefix}-ci-release/$BASE_REF/DEBUG/pr/UT-Report/${PR_NUMBER}
          be_ut_res_path=${oss_path}/flag/be_ut_res
          size=$(ossutil64 --config-file ~/.ossutilconfig ls ${be_ut_res_path} | grep "Object Number is" | awk '{print $NF}')
          echo "size=${size}" >> $GITHUB_OUTPUT
          if [[ "$size" != "0" ]]; then
            ossutil64 --config-file ~/.ossutilconfig cp ${be_ut_res_path} . >/dev/null
            res=`cat be_ut_res`
            if [[ "$res" != "0" ]]; then
              echo "::error::BE UT failed!"
              exit 1
            fi
            cd be
            ossutil64 --config-file ~/.ossutilconfig cp ${oss_path}/be_ut_coverage.xml . -f 1>/dev/null
            ossutil64 --config-file ~/.ossutilconfig cp ${oss_path}/base_version.txt . -f 1>/dev/null
            ossutil64 --config-file ~/.ossutilconfig cp ${oss_path}/diff.txt . -f 1>/dev/null
            echo "base_version=`cat base_version.txt`" >> $GITHUB_OUTPUT
          else
            rm -rf ./coverchecker && ln -s /var/local/env/coverchecker ./coverchecker && cd coverchecker && git pull
            export JAVA_HOME=/var/local/env/jdk1.8.0_202;
            export PATH=$JAVA_HOME/bin:$PATH;
            java -jar cover-checker-console/target/cover-checker-console-1.4.0-jar-with-dependencies.jar \
              --cover /var/local/env/be_empty_coverage.xml --github-token ${{ secrets.GITHUB_TOKEN }} --pr ${PR_NUMBER} \
              --repo ${{ github.repository }} --threshold 80 --github-url api.github.com -type cobertura --module BE
          fi

      - name: Merge BE Total Coverage
        id: merge
        if: github.repository == 'StarRocks/starrocks' && steps.download-ut-xml.outputs.size != '0' && steps.download-ut-xml.outcome == 'success'
        run: |
          rm -rf ./ci-tool && cp -rf /var/lib/ci-tool ./ci-tool && cd ci-tool && git pull && source lib/init.sh
          
          export ECI_ID=`./bin/create_eci.sh ${BASE_REF} ${REPO}`
          export TOTAL_COV_XML=/var/local/env/be_total_coverage_${PR_NUMBER}.xml
          export COV_LOG=/var/local/env/be_total_coverage_${PR_NUMBER}.log
          export RES_FILE=/var/local/env/be_total_coverage_res_${PR_NUMBER}.log
               
          echo ${ECI_ID}
          echo "ECI_ID=${ECI_ID}" >> $GITHUB_OUTPUT
          echo "COV_XML=${TOTAL_COV_XML}" >> $GITHUB_OUTPUT
          echo "COV_LOG=${COV_LOG}" >> $GITHUB_OUTPUT
          echo "RES_FILE=${RES_FILE}" >> $GITHUB_OUTPUT
          
          ./bin/gen_be_cov.sh ${REPO} ${BASE_REF} ${PR_NUMBER} ${HEAD_SHA}

      # Incremental Total Coverage
      - name: Publish Incremental Coverage Report - Total
        if: always() && steps.download-ut-xml.outputs.size != '0' && steps.download-ut-xml.outcome == 'success'
        env:
          be_path: ${{ github.workspace }}/be
          merge_outcome: ${{ steps.merge.outcome }}
          total_xml: ${{ steps.merge.outputs.COV_XML }}
        run: |
          rm -rf ./coverchecker && ln -s /var/local/env/coverchecker ./coverchecker && cd coverchecker && git pull
          export JAVA_HOME=/var/local/env/jdk1.8.0_202;
          export PATH=$JAVA_HOME/bin:$PATH;
          if [[ "${{ github.repository }}" != "StarRocks/starrocks" ]] || [[ "${merge_outcome}" == "failure" ]]; then
              total_xml=${be_path}/be_ut_coverage.xml
          fi
          java -jar cover-checker-console/target/cover-checker-console-1.4.0-jar-with-dependencies.jar \
            --cover ${total_xml} --github-token ${{ secrets.GITHUB_TOKEN }} --repo ${{ github.repository }} \
            --threshold 80 --github-url api.github.com --pr ${PR_NUMBER} -type cobertura --module BE \
            -d ${be_path}/diff.txt -dt file

      - name: Clean ENV
        if: always()
        run: |
          rm -rf ${{ github.workspace }}/*
          eci rm ${{ steps.merge.outputs.ECI_ID }} || true
          rm -rf ${{ steps.merge.outputs.COV_LOG }} ${{ steps.merge.outputs.COV_XML }} ${{ steps.merge.outputs.RES_FILE }}

  SQL-Tester-REPORT:
    runs-on: [ self-hosted, quick ]
    needs: INFO
    if: needs.INFO.outputs.PR_NUMBER != '' && needs.INFO.outputs.BASE_REF == 'main'
    env:
      PR_NUMBER: ${{ needs.INFO.outputs.PR_NUMBER }}
      BASE_REF: ${{ needs.INFO.outputs.BASE_REF }}
    steps:
      - name: CLEAN
        run: |
          rm -rf ${{ github.workspace }} && mkdir -p ${{ github.workspace }}

      - name: INFO
        id: info
        run: |
          repo="${{ github.repository }}"
          bucket_prefix=`echo ${repo%/*} | tr '[:upper:]' '[:lower:]'`
          echo "bucket_prefix=${bucket_prefix}" >> $GITHUB_OUTPUT

      - name: Download SQL-Tester XML
        id: download-SQL-Tester-xml
        env:
          bucket_prefix: ${{ steps.info.outputs.bucket_prefix }}
        run: |
          mkdir sql-tester-result && cd sql-tester-result
          oss_path=oss://${bucket_prefix}-ci-release/$BASE_REF/Release/pr/SQL-Tester-XML/${PR_NUMBER}/
          size=$(ossutil64 --config-file ~/.ossutilconfig ls ${oss_path} | grep "Object Number is" | awk '{print $NF}')
          echo "size=${size}" >> $GITHUB_OUTPUT
          if [[ "$size" != "0" ]]; then
            ossutil64 --config-file ~/.ossutilconfig cp ${oss_path} . --recursive
          else
            cp /var/local/env/sqltester_empty_coverage.xml .
          fi

      - name: Prepare Tools
        id: prepare-tools
        run: |
          mkdir -p .actions/nose-report-action
          cd .actions/nose-report-action
          git clone https://github.com/StarRocks/action-junit-report.git .

      - name: Publish SQL-Tester Report
        uses: ./.actions/nose-report-action
        if: steps.prepare-tools.outcome == 'success'
        with:
          check_name: 'SQL-Tester Report'
          fail_on_failure: true
          detailed_summary: true
          token: ${{ secrets.GITHUB_TOKEN }}
          commit: ${{ env.HEAD_SHA }}
          report_paths: 'sql-tester-result/*.xml'

  Admit-REPORT:
    runs-on: [ self-hosted, quick ]
    needs: INFO
    if: needs.INFO.outputs.PR_NUMBER != '' && needs.INFO.outputs.BASE_REF == 'main'
    env:
      PR_NUMBER: ${{ needs.INFO.outputs.PR_NUMBER }}
      BASE_REF: ${{ needs.INFO.outputs.BASE_REF }}
    steps:
      - name: CLEAN
        run: |
          rm -rf ${{ github.workspace }} && mkdir -p ${{ github.workspace }}

      - name: INFO
        id: info
        run: |
          repo="${{ github.repository }}"
          bucket_prefix=`echo ${repo%/*} | tr '[:upper:]' '[:lower:]'`
          echo "bucket_prefix=${bucket_prefix}" >> $GITHUB_OUTPUT

      - name: Download Admit XML
        id: download-admit-xml
        env:
          bucket_prefix: ${{ steps.info.outputs.bucket_prefix }}
        run: |
          mkdir admit-result && cd admit-result
          oss_path=oss://${bucket_prefix}-ci-release/$BASE_REF/Release/pr/Admit-XML/${PR_NUMBER}/
          size=$(ossutil64 --config-file ~/.ossutilconfig ls ${oss_path} | grep "Object Number is" | awk '{print $NF}')
          echo "size=${size}" >> $GITHUB_OUTPUT
          if [[ "$size" != "0" ]]; then
            ossutil64 --config-file ~/.ossutilconfig cp ${oss_path} . --recursive
          fi

      - name: Prepare Tools
        if: steps.download-admit-xml.outputs.size != '0'
        id: prepare-tools
        run: |
          mkdir -p .actions/nose-report-action
          cd .actions/nose-report-action
          git clone https://github.com/StarRocks/action-junit-report.git .

      - name: Publish Admit Report
        uses: ./.actions/nose-report-action
        if: steps.prepare-tools.outcome == 'success'
        with:
          check_name: 'Admit Report'
          fail_on_failure: true
          detailed_summary: true
          commit: ${{ env.HEAD_SHA }}
          token: ${{ secrets.GITHUB_TOKEN }}
          report_paths: 'admit-result/*.xml'

  NOTIFICATION:
    runs-on: [ self-hosted, quick ]
    needs: [ INFO, FE-REPORT, Admit-REPORT, BE-REPORT, SQL-Tester-REPORT ]
    if: always() && needs.INFO.outputs.PR_NUMBER != ''
    env:
      WORKFLOW_RUN_ID: ${{ github.event.workflow_run.id }}
      FEISHU_APP_ID: ${{ secrets.FEISHU_APP_ID }}
      FEISHU_APP_SECRET: ${{ secrets.FEISHU_APP_SECRET }}
      PR_NUMBER: ${{ needs.INFO.outputs.PR_NUMBER }}
    steps:
      - name: CLEAN
        run: |
          rm -rf ${{ github.workspace }} && mkdir -p ${{ github.workspace }}

      - name: NOTIFY
        run: |
          rm -rf ./ci-tool && cp -rf /var/lib/ci-tool ./ci-tool && cd ci-tool && git pull && source lib/init.sh
          ./bin/notify.sh

      - name: Clean ENV
        if: always()
        run: |
          rm -rf ${{ github.workspace }}/*
